/* Codigo C Trabajo Practico 1 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <getopt.h>
#include <ctype.h>
#include "bubblesort.h"
#include "shellsort.h"
#include "utils.h"

const char* modifiers = "hVms";

static struct option long_options[] = { { "help", no_argument, 0, 'h' }, {
		"version", no_argument, 0, 'V' }, { "bubble", no_argument, 0, 'm' }, {
		"sel", no_argument, 0, 's' }, { 0, 0, 0, 0 } };

typedef struct options_flags {
	int flag_file1; //Si hay un archivo de entrada file1 = 1
} Oflags;

Oflags oflags;

int numParameters = 0;
//Funciones para parsear los parametros
int getOptions(int argc, char** argv, char** ofname);

int main(int argc, char** argv) {

	char* ofname = NULL;

	if (getOptions(argc, argv, &ofname) != EXIT_SUCCESS)
		return -1;
	return 0;
}

void help() {
	printf("Menu de Ayuda\n");
	printf("-------------\n\n");
	printf("\nTP1 [OPTIONS][file...] \n");
	printf("-h, --help display use the this help and exit.\n");
	printf("-V, --version display use the version information and exit.\n");
	printf("-m, --bubble bubblesort algorithm.\n");
	printf("-s, --sel shellsort algorithm.\n\n");
}

void version() {
	printf("\nOrganizacion de Computadoras - 6620\n\tTP1 - Version 1.0.0 \n\n");
}

void imprimirArray(unsigned char * arrayToSort[], int arraySize) {
	int i = 0;
	for (; i < arraySize; ++i) {
		printf("%s \n", arrayToSort[i]);
	}
}

int getOptions(int argc, char** argv, char** ofname) {
	int option_index = 0;
	int c;
	opterr = 0;
	int arraySize = 0;
	unsigned char ** arrayToSort = NULL;

	//si no hay parametros imprimo la ayuda
	if (argc == 1) {
		help();
		return -1;
	}

	while ((c = getopt_long(argc, argv, modifiers, long_options, &option_index))
			!= EOF) {

		switch (c) {
		case 'h':
			help();
			return -1;
			break;
		case 'V':
			version();
			return -1;
			break;
		case 'm':

			//junto todos los archivos en un array
			while (optind < argc) {
				FILE * file = fopen(argv[optind++], "rb");
				if (file == NULL)
					fprintf(stderr, "No se ha encontrado el archivo: %s\n",
							argv[optind - 1]);
				else
					arrayToSort = loadArrayFromFile(&arraySize, file);
			}

			//invoco metodo merge
			bubblesort(arrayToSort,arraySize);
			//Imprimo por pantalla
			imprimirArray(arrayToSort, arraySize);
			
			break;
		case 's':
			//fusiono todos los archivos en un array
			while (optind < argc) {

				FILE * file = fopen(argv[optind++], "rb");
				if (file == NULL)
					fprintf(stderr, "No se ha encontrado el archivo: %s\n",
							argv[optind - 1]);
				else
					arrayToSort = loadArrayFromFile(&arraySize, file);
				fclose(file);
			}
	
			// invoco metodo SelectionSort
			shellsort(arrayToSort,arraySize);
			// Imprimo por pantalla
			imprimirArray(arrayToSort,arraySize);
			break;

		default:
			help();
			abort();
			break;
		}
	}

	int j;
	for (j = 0; j < arraySize; ++j)
		free(arrayToSort[j]);
	free(arrayToSort);

	return EXIT_SUCCESS;
}
